<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    div, li, p {
      line-height: 40px;
    }
    span {
      color: red;
    }
  </style>
</head>
<body>
  <h2>函数的扩展</h2>
  <ul>
    <li>ES6允许为函数的参数设置默认值，即直接写在参数定义的后面</li>
    <li>参数默认值每次都重新计算默认值表达式的值</li>
    <li>
      与解构赋值默认值结合使用：只有当函数的参数是一个对象的时候，变量才会通过解构赋值而生成。如果函数foo调用时参数不是对象，对应变量就不会生成
    </li>
    <li>
      <h3>参数默认值的位置</h3>
      <ul>
        <li>通常情况下，定义了默认值的参数应该是函数的尾参数</li>
        <li>如果非尾部的参数设置默认值，实际上这个参数是无法省略的</li>
        <li>无法省略的参数必须显示传入undefined，传入null则没这个效果</li>
      </ul>
    </li>
    <li>
      <h3>函数的length属性</h3>
      <ul>
        <li>
          制定了默认值以后，函数的length属性将返回<span>没有指定默认值的</span>参数个数，也就是说，指定了默认值后，length属性将失真
        </li>
        <li>
          length属性的含义是该函数预期传入的参数个数
        </li>
        <li>
          如果设置了默认值的参数不是尾参数，那么length属性也不会计入后面的参数
        </li>
      </ul>
    </li>
    <li>
      <h3>作用域</h3>
      <ul>
        <li>
          一旦设置了参数的默认值，函数进行声明初始化时，<span>参数</span>会形成一个单独的作用域。
        </li>
        <li>初始化结束，这个作用域就会消失</li>
        <li>这种语法行为在不设置参数的默认值时是不会出现的</li>
      </ul>
    </li>
    <li>
      <h3>rest参数</h3>
      <ul>
        <li>ES6引入了rest参数（形式为"...变量名"），用于获取函数的多余参数</li>
        <li>rest参数的变量代表一个数组，所以数组特有的方法都可以用于这个变量</li>
        <li>rest参数后不能有其他参数，（即只能是最后一个参数），否则会报错</li>
        <li>函数的length属性不包括rest参数</li>
      </ul>
    </li>
    <li>
      <h3>基本用法</h3>
      <ul>
        <li>如果箭头函数不需要参数或需要多个参数，就使用圆括号代表参数部分</li>
        <li>箭头函数的代码部分多于一条语句，就要使用大括号将其括起来</li>
        <li>
          <h3>箭头函数的几个使用注意事项</h3>
          <ul>
            <li>函数体内的this对象就是定义时所在的对象</li>
            <li>箭头函数的this是继承来的,本身没有this。所以不可以当作构造函数使用</li>
            <li>不可以使用arguments对象，该对象在函数体内不存在，如果要用，可以用rest参数代替</li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</body>
</html>